// #include <ClosedCube_HDC1080.h>
// ClosedCube_HDC1080 hdc1080;

// void setup() {
//   hdc1080.begin(0x40);
//   Serial.begin(115200);
//   Serial.println(hdc1080.readManufacturerId());//21577
//   Serial.println(hdc1080.readDeviceId());//4176
// }

// void loop() {
//   Serial.print("Temperature: ");
//   Serial.print(hdc1080.readTemperature());
//   Serial.print(" °C, Humidity: ");
//   Serial.print(hdc1080.readHumidity());
//   Serial.println(" %");
//   delay(2000);
// }

#include <Wire.h>

// HDC1080 的I2C地址（默认0x40）
#define HDC1080_ADDRESS 0x40

// HDC1080 寄存器地址
#define TEMPERATURE_REG  0x00
#define HUMIDITY_REG     0x01
#define CONFIG_REG       0x02

void setup() {
  Serial.begin(115200);
  Wire.begin(); // 初始化I2C，默认SDA=21, SCL=22

  // 配置HDC1080为14位精度（温度+湿度）
  Wire.beginTransmission(HDC1080_ADDRESS);
  Wire.write(CONFIG_REG);       // 指向配置寄存器
  Wire.write(0x10);             // 设置分辨率：温度14位，湿度14位
  Wire.write(0x00);             // 其他配置保持默认
  Wire.endTransmission();

  delay(15); // 等待传感器初始化
}

void loop() {
  float temperature = readTemperature();
  float humidity = readHumidity();

  // 打印数据到串口
  Serial.print("Temperature: ");
  Serial.print(temperature, 6); // 保留1位小数
  Serial.print(" °C\t");

  Serial.print("Humidity: ");
  Serial.print(humidity, 6);
  Serial.println(" %");

  delay(1000); // 每2秒读取一次
}

// 读取温度（单位：°C）
float readTemperature() {
  Wire.beginTransmission(HDC1080_ADDRESS);
  Wire.write(TEMPERATURE_REG); // 触发温度测量
  Wire.endTransmission();

  delay(30); // 等待测量完成（数据手册建议至少6.5ms）

  Wire.requestFrom(HDC1080_ADDRESS, 2); // 读取2字节数据
  while (Wire.available() < 2);
  uint16_t rawTemp = (Wire.read() << 8) | Wire.read();
  
  // 转换公式（来自HDC1080数据手册）
  return (rawTemp / 65536.0) * 165.0 - 40.0;
}

// 读取湿度（单位：%）
float readHumidity() {
  Wire.beginTransmission(HDC1080_ADDRESS);
  Wire.write(HUMIDITY_REG); // 触发湿度测量
  Wire.endTransmission();

  delay(30); // 等待测量完成

  Wire.requestFrom(HDC1080_ADDRESS, 2);
  while (Wire.available() < 2);
  uint16_t rawHumidity = (Wire.read() << 8) | Wire.read();
  
  return (rawHumidity / 65536.0) * 100.0;
}

// #include <Wire.h>

// // HDC1080 配置
// #define HDC1080_ADDRESS   0x40    // I2C地址
// #define TEMP_REG          0x00    // 温度寄存器
// #define HUMIDITY_REG      0x01    // 湿度寄存器
// #define CONFIG_REG        0x02    // 配置寄存器
// #define MANUFACTURER_REG  0xFE    // 厂商ID寄存器（用于验证传感器）

// // 错误代码
// #define READ_SUCCESS      0
// #define I2C_ERROR        -1
// #define SENSOR_NOT_FOUND -2

// void setup() {
//   Serial.begin(115200);
//   while (!Serial); // 等待串口就绪（仅用于调试）

//   // 初始化I2C（可自定义引脚：Wire.begin(SDA_PIN, SCL_PIN);）
//   Wire.begin();
  
//   // 验证传感器连接
//   int status = checkHDC1080();
//   if (status != READ_SUCCESS) {
//     Serial.print("HDC1080初始化失败，错误码: ");
//     Serial.println(status);
//     while (1); // 停止执行
//   }

//   // 配置传感器（14位精度，独立测量模式）
//   configureHDC1080();
// }

// void loop() {
//   float temperature, humidity;
  
//   // 读取温度
//   int tempStatus = readTemperature(&temperature);
//   if (tempStatus != READ_SUCCESS) {
//     Serial.println("温度读取失败");
//   }

//   // 读取湿度
//   int humidStatus = readHumidity(&humidity);
//   if (humidStatus != READ_SUCCESS) {
//     Serial.println("湿度读取失败");
//   }

//   // 打印结果（仅当两者都成功时）
//   if (tempStatus == READ_SUCCESS && humidStatus == READ_SUCCESS) {
//     Serial.print("Temperature: ");
//     Serial.print(temperature, 8); // 保留1位小数
//     Serial.print(" °C\t");
//     Serial.print("Humidity: ");
//     Serial.print(humidity, 8);
//     Serial.println(" %");
//   }

//   delay(2000); // 2秒间隔
// }

// // 验证传感器是否存在
// int checkHDC1080() {
//   Wire.beginTransmission(HDC1080_ADDRESS);
//   if (Wire.endTransmission() != 0) {
//     return SENSOR_NOT_FOUND;
//   }

//   // 可选：读取厂商ID验证（0x5449表示Texas Instruments）
//   Wire.beginTransmission(HDC1080_ADDRESS);
//   Wire.write(MANUFACTURER_REG);
//   if (Wire.endTransmission() != 0) return I2C_ERROR;
  
//   delay(10);
//   Wire.requestFrom(HDC1080_ADDRESS, 2);
//   if (Wire.available() < 2) return I2C_ERROR;
  
//   uint16_t manufacturerID = (Wire.read() << 8) | Wire.read();
//   if (manufacturerID != 0x5449) return SENSOR_NOT_FOUND;
  
//   return READ_SUCCESS;
// }

// // 配置传感器
// void configureHDC1080() {
//   Wire.beginTransmission(HDC1080_ADDRESS);
//   Wire.write(CONFIG_REG);
//   Wire.write(0x10); // 温度14位 + 湿度14位
//   Wire.write(0x00); // 电池状态正常，独立测量模式
//   Wire.endTransmission();
//   delay(15); // 等待配置生效
// }

// // 读取温度（通过指针返回结果）
// int readTemperature(float *temp) {
//   Wire.beginTransmission(HDC1080_ADDRESS);
//   Wire.write(TEMP_REG);
//   if (Wire.endTransmission() != 0) return I2C_ERROR;
  
//   delay(20); // 等待转换完成（数据手册要求6.5ms）
  
//   if (Wire.requestFrom(HDC1080_ADDRESS, 2) != 2) return I2C_ERROR;
//   uint16_t rawTemp = (Wire.read() << 8) | Wire.read();
//   *temp = (rawTemp / 65536.0) * 165.0 - 40.0;
//   return READ_SUCCESS;
// }

// // 读取湿度（通过指针返回结果）
// int readHumidity(float *humid) {
//   Wire.beginTransmission(HDC1080_ADDRESS);
//   Wire.write(HUMIDITY_REG);
//   if (Wire.endTransmission() != 0) return I2C_ERROR;
  
//   delay(20);
  
//   if (Wire.requestFrom(HDC1080_ADDRESS, 2) != 2) return I2C_ERROR;
//   uint16_t rawHumid = (Wire.read() << 8) | Wire.read();
//   *humid = (rawHumid / 65536.0) * 100.0;
//   return READ_SUCCESS;
// }